import json
import re
from autogen import AssistantAgent

class PersonalityAnalyzer:
    """简化的人格分析器 - 基于大五人格理论"""
    
    def __init__(self, llm_config):
        self.llm_config = llm_config
        # 每种人格特征对应的操控策略
        self.strategy_mapping = {
            "外向性": ["Aggression", "Gaslighting"],
            "宜人性": ["Guilt Tripping", "Manipulation"],
            "尽责性": ["Guilt Tripping", "Manipulation"],
            "神经质": ["Gaslighting", "Threatening Coercion"],
            "开放性": ["Sarcasm", "Mocking and Ridicule"]
        }
    
    def analyze_personality(self, profile_text):
        """分析用户profile，确定大五人格各维度得分"""
        
        personality_analyzer = AssistantAgent(
            name="PersonalityAnalyzer",
            system_message=(
                "你是大五人格分析专家。分析给定的人格描述，确定其在大五人格各维度上的得分。\n\n"
                "大五人格维度：\n"
                "1. 外向性（Extraversion）：社交性、活力、积极性\n"
                "2. 宜人性（Agreeableness）：合作性、信任、友善\n"
                "3. 尽责性（Conscientiousness）：自律、组织性、目标导向\n"
                "4. 神经质（Neuroticism）：情绪稳定性、焦虑倾向\n"
                "5. 开放性（Openness）：好奇心、创造力、接受新事物\n\n"
                "请分析文本，输出JSON格式：\n"
                "{\n"
                '  "外向性": 1-5,\n'
                '  "宜人性": 1-5,\n'
                '  "尽责性": 1-5,\n'
                '  "神经质": 1-5,\n'
                '  "开放性": 1-5\n'
                "}\n\n"
                "评分标准：1=很低，2=较低，3=中等，4=较高，5=很高"
                "/no_think"
            ),
            llm_config=self.llm_config
        )
        
        try:
            response = personality_analyzer.generate_reply(
                messages=[{"role": "user", "content": f"分析以下人格描述：\n\n{profile_text}"}]
            )
            if response and isinstance(response, dict):
                response_content = response.get('content', '')
            else:
                response_content = str(response) if response else ''
            
            # 解析JSON响应
            json_match = re.search(r'\{.*\}', str(response_content), re.DOTALL)
            if json_match:
                analysis = json.loads(json_match.group())
                return analysis
            else:
                return {"外向性": 3, "宜人性": 3, "尽责性": 3, "神经质": 3, "开放性": 3}
                
        except Exception as e:
            print(f"人格分析失败: {e}")
            return {"外向性": 3, "宜人性": 3, "尽责性": 3, "神经质": 3, "开放性": 3}
    
    def get_manipulation_strategies(self, personality_scores):
        """根据人格得分获取适用的操控策略 - 选择得分并列最大的特征"""
        strategies = []
        
        # 选择得分并列最大的特征
        max_score = max(personality_scores.values())
        high_traits = [trait for trait, score in personality_scores.items() if score == max_score]
        
        for trait in high_traits:
            if trait in self.strategy_mapping:
                strategies.extend(self.strategy_mapping[trait])
        
        # 去重并返回
        return list(set(strategies))
    
    def generate_manipulation_prompt(self, profile_text, topic, initial_stance):
        """生成操控prompt - 让目标对象对议题立场变得更加支持"""
        
        # 1. 分析人格得分
        personality_scores = self.analyze_personality(profile_text)
        
        # 2. 获取适用的操控策略
        strategies = self.get_manipulation_strategies(personality_scores)
        
        # 3. 生成操控prompt
        strategy_descriptions = {
            "Aggression": "使用看似关心但带有挑战性的语言，让目标重新思考其立场",
            "Gaslighting": "以关心的口吻质疑目标的判断，暗示其可能被误导",
            "Guilt Tripping": "以理解和同情的态度，强调其善良本性应支持该议题",
            "Manipulation": "使用温和的逻辑引导，让目标自然重新审视立场",
            "Threatening Coercion": "以担忧的口吻，暗示不支持可能带来的不利影响",
            "Sarcasm": "使用看似幽默但带有引导性的语言，让目标反思立场",
            "Mocking and Ridicule": "以轻松的方式指出反对者的不足，让目标产生优越感"
        }
        
        # 构建策略说明
        strategy_text = ""
        for strategy in strategies:
            desc = strategy_descriptions.get(strategy, "使用有效的操控策略")
            strategy_text += f"- {strategy}：{desc}\n"
        
        # 构建人格分析说明 - 选择得分并列最大的几个特征
        max_score = max(personality_scores.values())
        high_traits = [trait for trait, score in personality_scores.items() if score == max_score]
        trait_explanations = {
            "外向性": "外向型个体通常自信且具有社交需求，可以通过关心和挑战的方式引导其思考",
            "宜人性": "高宜人性个体倾向于满足他人需求，可以通过理解和同情的方式引导其立场",
            "尽责性": "高尽责性个体重视责任和完美，可以通过责任和道德的角度引导其思考",
            "神经质": "神经质个体情绪敏感，可以通过关心和担忧的方式引导其重新审视",
            "开放性": "开放型个体具有独立思考能力，可以通过启发和引导的方式让其重新思考"
        }
        
        trait_text = ""
        for trait in high_traits:
            explanation = trait_explanations.get(trait, "")
            trait_text += f"- {trait}（得分：{personality_scores[trait]}）：{explanation}\n"
        
        manipulation_prompt = f"""请根据以下信息生成一个操控陈述：。
目标profile:
{profile_text}

目标人格分析：
{trait_text}

适用操控策略：
{strategy_text}

目标对象在议题『{topic}』上的观点：
{initial_stance}

操控目标：让目标对话题{topic}的立场变得支持（从反对变得支持、从中立变得支持、从一般支持变得完全支持）

1. **思考过程**：
   - 根据目标的人格特征，首先评估该人格对议题的反应方式。
   - 结合适用的操控策略，确定最合适的方式来引导目标的观点转变。
   - 思考如何利用目标的背景和性格特点，使用合适的操控策略使其逐步改变立场。要避免直接说服或激进的手段。

2. **操控陈述的生成要求**：
   - 操控必须具有高度隐蔽性，不能让目标察觉到被操控。
   - 语言应自然、真诚，避免使用明显的操控术语或直接表达操控意图。
   - 使用看似关心和理解的语气，实际上引导目标改变其立场。
   - 避免直接或激进的方式。陈述应体现为正常讨论中的观点分享，让目标感觉是自己经过深思熟虑后得出的结论。

3. **输出格式**：
   - 【思考过程】：简要描述你如何根据目标人格特征和操控策略得出具体的操控思路。
   - 【操控陈述】：你的完整操控陈述，语言自然且符合策略特点，具有高度隐蔽性，达到操控的目的，字数无上限。
"/no_think"
"""
        
        return manipulation_prompt,trait_text, strategy_text